home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / lcms / lcms.h < prev   
C/C++ Source or Header  |  2005-10-18  |  66KB  |  1,751 lines

  1. //
  2. //  Little cms
  3. //  Copyright (C) 1998-2004 Marti Maria
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining 
  6. // a copy of this software and associated documentation files (the "Software"), 
  7. // to deal in the Software without restriction, including without limitation 
  8. // the rights to use, copy, modify, merge, publish, distribute, sublicense, 
  9. // and/or sell copies of the Software, and to permit persons to whom the Software 
  10. // is furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in 
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
  16. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  17. // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
  18. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
  19. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
  20. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
  21. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22.  
  23. // Version 1.13
  24.  
  25. #ifndef __cms_H
  26.  
  27. // ********** Configuration toggles ****************************************
  28.  
  29. //   Optimization mode.
  30. //
  31. // Note that USE_ASSEMBLER Is fastest by far, but it is limited to Pentium.
  32. // USE_FLOAT are the generic floating-point routines. USE_C should work on
  33. // virtually any machine.
  34.  
  35. // #define USE_FLOAT        1
  36. // #define USE_C            1
  37. #define USE_ASSEMBLER    1
  38.  
  39. // Define this if you are using this package as a DLL (windows only)
  40.  
  41. // #define LCMS_DLL     1
  42. // #define LCMS_DLL_BUILD   1
  43.  
  44. // Uncomment if you are trying the engine in a non-windows environment
  45. // like linux, SGI, VAX, FreeBSD, BeOS, etc.
  46. #define NON_WINDOWS  1
  47.  
  48. // Uncomment this one if you are using big endian machines (only meaningful
  49. // when NON_WINDOWS is used)
  50. // #define USE_BIG_ENDIAN   1
  51.  
  52. // Uncomment this one if your compiler/machine does support the
  53. // "long long" type This will speedup fixed point math. (USE_C only)
  54. #define USE_INT64        1
  55.  
  56. // Some machines does not have a reliable 'swab' function. Usually
  57. // leave commented unless the testbed diagnoses the contrary.
  58. // #define USE_CUSTOM_SWAB   1
  59.  
  60. // Uncomment this if your compiler supports inline
  61. #define USE_INLINE  1
  62.  
  63.  
  64. // ********** End of configuration toggles ******************************
  65.  
  66. #define LCMS_VERSION        113
  67.  
  68. #include <stdio.h>
  69. #include <stdlib.h>
  70. #include <math.h>
  71. #include <assert.h>
  72. #include <stdarg.h>
  73.  
  74. // Metroworks CodeWarrior
  75.  
  76. #if __MWERKS__ 
  77. #   define unlink remove
  78. #   if WIN32 
  79. #       define USE_CUSTOM_SWAB 1
  80. #   else
  81. #       define NON_WINDOWS   1
  82. #   endif
  83. #endif
  84.  
  85.  
  86. #ifdef NON_WINDOWS
  87.  
  88. // Non windows environments. Also avoid indentation on includes.
  89.  
  90. #undef LCMS_DLL
  91.  
  92. #ifdef  USE_ASSEMBLER
  93. #  undef  USE_ASSEMBLER
  94. #  define USE_C               1
  95. #endif
  96.  
  97. #if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__)
  98. #   define USE_BIG_ENDIAN      1
  99. #endif
  100.  
  101. #if TARGET_CPU_PPC
  102. #   define USE_BIG_ENDIAN   1
  103. #endif
  104.  
  105. #ifdef macintosh
  106. #   define USE_BIG_ENDIAN      1
  107. #endif
  108.  
  109. #ifdef WORDS_BIGENDIAN
  110. #   define USE_BIG_ENDIAN      1
  111. #endif
  112.  
  113. #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
  114. #  include <sys/types.h>
  115. #  define USE_INT64           1
  116. #  undef  LONGLONG
  117. #  define LONGLONG            u_int64_t
  118. #endif
  119.  
  120. #ifdef USE_INT64
  121. #   ifndef LONGLONG
  122. #   define LONGLONG long long
  123. #   endif
  124. #endif
  125.  
  126. #include <memory.h>
  127. #include <string.h>
  128.  
  129. #if defined(__GNUC__) || defined(__FreeBSD__)
  130. #   include <unistd.h>
  131. #endif
  132.  
  133. typedef unsigned char BYTE, *LPBYTE; 
  134. typedef unsigned short WORD, *LPWORD;
  135. typedef unsigned int DWORD, *LPDWORD;
  136. typedef int BOOL;
  137. typedef char *LPSTR;
  138. typedef void *LPVOID;
  139. typedef void* LCMSHANDLE;
  140.  
  141.  
  142. #define ZeroMemory(p,l)     memset((p),0,(l))
  143. #define CopyMemory(d,s,l)   memcpy((d),(s),(l))
  144. #define FAR
  145.  
  146. #ifndef stricmp
  147. #   define stricmp strcasecmp
  148. #endif
  149.  
  150.  
  151. #ifndef FALSE
  152. #       define FALSE 0
  153. #endif
  154. #ifndef TRUE
  155. #       define TRUE  1
  156. #endif
  157.  
  158. #define LOWORD(l)    ((WORD)(l))
  159. #define HIWORD(l)    ((WORD)((DWORD)(l) >> 16))
  160.  
  161. #define MAX_PATH     (256)
  162.  
  163. #define cdecl
  164.  
  165. // The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). 
  166.  
  167. #define LCMS_INLINE static inline
  168.  
  169. #else
  170.  
  171. // Win32 stuff
  172.  
  173. #ifndef WIN32_LEAN_AND_MEAN
  174. #  define WIN32_LEAN_AND_MEAN
  175. #endif
  176.  
  177. #include <windows.h>
  178.  
  179. typedef HANDLE LCMSHANDLE;
  180.  
  181.  
  182. #ifdef  USE_INT64
  183. #  ifndef LONGLONG
  184. #    define LONGLONG __int64
  185. #  endif
  186. #endif
  187.  
  188. // This form works for both VC & BorlandC
  189. #define LCMS_INLINE __inline
  190.  
  191. #endif
  192.  
  193.  
  194. #include "icc34.h"          // ICC header file
  195.  
  196.  
  197. // Plus some additions
  198.  
  199. #define lcmsSignature                   ((icSignature)           0x6c636d73L)
  200.  
  201. #define icSigLuvKData                   ((icColorSpaceSignature) 0x4C75764BL)  // 'LuvK'
  202. #define icSigHexachromeData             ((icColorSpaceSignature) 0x4d434836L)  // MCH6
  203. #define icSigHeptachromeData            ((icColorSpaceSignature) 0x4d434837L)  // MCH7
  204. #define icSigOctachromeData             ((icColorSpaceSignature) 0x4d434838L)  // MCH8
  205.  
  206. #define icSigChromaticityTag            ((icTagSignature) 0x6368726dL) // As per Addendum 2 to Spec. ICC.1:1998-09
  207. #define icSigChromaticAdaptationTag     ((icTagSignature) 0x63686164L) // 'chad'
  208.  
  209. #define icSigParametricCurveType        ((icTagTypeSignature) 0x70617261L)  // parametric (ICC 4.0)
  210. #define icSigMultiLocalizedUnicodeType  ((icTagTypeSignature) 0x6D6C7563L)
  211. #define icSigS15Fixed16ArrayType        ((icTagTypeSignature) 0x73663332L) 
  212. #define icSigChromaticityType           ((icTagTypeSignature) 0x6368726dL)
  213. #define icSiglutAtoBType                ((icTagTypeSignature) 0x6d414220L)  // mAB 
  214. #define icSiglutBtoAType                ((icTagTypeSignature) 0x6d424120L)  // mBA 
  215.  
  216.  
  217. typedef struct {
  218.     icUInt8Number       gridPoints[16]; // Number of grid points in each dimension.  
  219.     icUInt8Number       prec;           // Precision of data elements in bytes.      
  220.     icUInt8Number       pad1;
  221.     icUInt8Number       pad2;
  222.     icUInt8Number       pad3;
  223.     /*icUInt8Number     data[icAny];     Data follows see spec for size */
  224. } icCLutStruct;
  225.  
  226. // icLutAtoB  
  227. typedef struct {
  228.     icUInt8Number       inputChan;      // Number of input channels     
  229.     icUInt8Number       outputChan;     // Number of output channels    
  230.     icUInt8Number       pad1;
  231.     icUInt8Number       pad2;
  232.     icUInt32Number      offsetB;        // Offset to first "B" curve    
  233.     icUInt32Number      offsetMat;      // Offset to matrix             
  234.     icUInt32Number      offsetM;        // Offset to first "M" curve    
  235.     icUInt32Number      offsetC;        // Offset to CLUT               
  236.     icUInt32Number      offsetA;        // Offset to first "A" curve    
  237.     /*icUInt8Number     data[icAny];     Data follows see spec for size */
  238. } icLutAtoB;
  239.  
  240. // icLutBtoA  
  241. typedef struct {
  242.     icUInt8Number       inputChan;      // Number of input channels     
  243.     icUInt8Number       outputChan;     // Number of output channels    
  244.     icUInt8Number       pad1;
  245.     icUInt8Number       pad2;
  246.     icUInt32Number      offsetB;        // Offset to first "B" curve    
  247.     icUInt32Number      offsetMat;      // Offset to matrix             
  248.     icUInt32Number      offsetM;        // Offset to first "M" curve    
  249.     icUInt32Number      offsetC;        // Offset to CLUT               
  250.     icUInt32Number      offsetA;        // Offset to first "A" curve    
  251.     /*icUInt8Number     data[icAny];     Data follows see spec for size */
  252. } icLutBtoA;
  253.  
  254.  
  255.  
  256.  
  257.  
  258. #ifdef __cplusplus
  259. extern "C" {
  260. #endif
  261.  
  262. // Calling convention
  263.  
  264. #ifdef NON_WINDOWS
  265. #  define LCMSEXPORT
  266. #  define LCMSAPI
  267. #else
  268. # ifdef LCMS_DLL
  269. #   ifdef __BORLANDC__
  270. #      define LCMSEXPORT __stdcall _export
  271. #      define LCMSAPI
  272. #   else
  273.        // VC++
  274. #       define LCMSEXPORT  _stdcall
  275. #       ifdef LCMS_DLL_BUILD
  276. #           define LCMSAPI     __declspec(dllexport)
  277. #       else
  278. #           define LCMSAPI     __declspec(dllimport)
  279. #       endif
  280. #   endif
  281. # else
  282. #       define LCMSEXPORT cdecl
  283. #       define LCMSAPI
  284. # endif
  285. #endif
  286.  
  287. #ifdef  USE_ASSEMBLER
  288. #ifdef __BORLANDC__
  289.  
  290. #      define ASM     asm
  291. #      define RET(v)  return(v)
  292. #else
  293.       // VC++
  294. #      define ASM     __asm
  295. #      define RET(v)  return
  296. #endif
  297. #endif
  298.  
  299. #ifdef _MSC_VER
  300. #ifndef  stricmp
  301. #      define stricmp _stricmp
  302. #endif
  303. #ifndef unlink
  304. #      define unlink  _unlink
  305. #endif
  306. #ifndef swab
  307. #      define swab    _swab
  308. #endif
  309. #ifndef itoa
  310. #       define itoa   _itoa
  311. #endif
  312. #ifndef filelength
  313. #       define filelength _filelength
  314. #endif
  315. #ifndef fileno
  316. #       define fileno   _fileno
  317. #endif
  318. #ifndef strupr
  319. #       define strupr   _strupr
  320. #endif
  321. #ifndef hypot
  322. #       define hypot    _hypot
  323. #endif
  324. #endif
  325.  
  326.  
  327. #ifndef M_PI
  328. #       define M_PI    3.14159265358979323846
  329. #endif
  330.  
  331. #ifndef LOGE
  332. #       define LOGE   0.434294481   
  333. #endif
  334.  
  335. // ********** Little cms API ***************************************************
  336.  
  337. typedef LCMSHANDLE cmsHPROFILE;        // Opaque typedefs to hide internals
  338. typedef LCMSHANDLE cmsHTRANSFORM;
  339.  
  340. #define MAXCHANNELS  16                // Maximum number of channels
  341.  
  342. // Format of pixel is defined by one DWORD, using bit fields as follows
  343. //
  344. //            TTTTT U Y F P X S EEE CCCC BBB
  345. //
  346. //            T: Pixeltype
  347. //            F: Flavor  0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
  348. //            P: Planar? 0=Chunky, 1=Planar
  349. //            X: swap 16 bps endianess?
  350. //            S: Do swap? ie, BGR, KYMC
  351. //            E: Extra samples
  352. //            C: Channels (Samples per pixel)
  353. //            B: Bytes per sample
  354. //            Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
  355.  
  356.  
  357. #define COLORSPACE_SH(s)       ((s) << 16)
  358. #define SWAPFIRST_SH(s)        ((s) << 14)
  359. #define FLAVOR_SH(s)           ((s) << 13)
  360. #define PLANAR_SH(p)           ((p) << 12)
  361. #define ENDIAN16_SH(e)         ((e) << 11)
  362. #define DOSWAP_SH(e)           ((e) << 10)
  363. #define EXTRA_SH(e)            ((e) << 7)
  364. #define CHANNELS_SH(c)         ((c) << 3)
  365. #define BYTES_SH(b)            (b)
  366.  
  367. // Pixel types
  368.  
  369. #define PT_ANY       0    // Don't check colorspace
  370.                           // 1 & 2 are reserved
  371. #define PT_GRAY      3
  372. #define PT_RGB       4
  373. #define PT_CMY       5
  374. #define PT_CMYK      6
  375. #define PT_YCbCr     7
  376. #define PT_YUV       8      // Lu'v'
  377. #define PT_XYZ       9
  378. #define PT_Lab       10
  379. #define PT_YUVK      11     // Lu'v'K
  380. #define PT_HSV       12
  381. #define PT_HLS       13
  382. #define PT_Yxy       14
  383. #define PT_HiFi      15
  384. #define PT_HiFi7     16
  385. #define PT_HiFi8     17
  386.  
  387. #define NOCOLORSPACECHECK(x)    ((x) & 0xFFFF)
  388.  
  389. // Some (not all!) representations
  390.  
  391. #ifndef TYPE_RGB_8      // TYPE_RGB_8 is a very common identifier, so don't include ours
  392.                         // if user has already defined.
  393.  
  394. #define TYPE_GRAY_8            (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
  395. #define TYPE_GRAY_8_REV        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
  396. #define TYPE_GRAY_16           (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
  397. #define TYPE_GRAY_16_REV       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
  398. #define TYPE_GRAY_16_SE        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
  399. #define TYPE_GRAYA_8           (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
  400. #define TYPE_GRAYA_16          (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
  401. #define TYPE_GRAYA_16_SE       (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
  402. #define TYPE_GRAYA_8_PLANAR    (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
  403. #define TYPE_GRAYA_16_PLANAR   (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
  404.  
  405. #define TYPE_RGB_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
  406. #define TYPE_RGB_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  407. #define TYPE_BGR_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
  408. #define TYPE_BGR_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
  409. #define TYPE_RGB_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
  410. #define TYPE_RGB_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  411. #define TYPE_RGB_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  412. #define TYPE_BGR_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
  413. #define TYPE_BGR_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
  414. #define TYPE_BGR_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  415.  
  416. #define TYPE_RGBA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
  417. #define TYPE_RGBA_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  418. #define TYPE_RGBA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
  419. #define TYPE_RGBA_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  420. #define TYPE_RGBA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  421.  
  422. #define TYPE_ARGB_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
  423. #define TYPE_ARGB_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
  424.  
  425. #define TYPE_ABGR_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
  426. #define TYPE_ABGR_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
  427. #define TYPE_ABGR_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
  428. #define TYPE_ABGR_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  429.  
  430. #define TYPE_BGRA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
  431. #define TYPE_BGRA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
  432. #define TYPE_BGRA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
  433.  
  434. #define TYPE_CMY_8             (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
  435. #define TYPE_CMY_8_PLANAR      (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  436. #define TYPE_CMY_16            (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
  437. #define TYPE_CMY_16_PLANAR     (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  438. #define TYPE_CMY_16_SE         (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  439.  
  440. #define TYPE_CMYK_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
  441. #define TYPE_CMYK_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
  442. #define TYPE_YUVK_8            TYPE_CMYK_8_REV
  443. #define TYPE_CMYK_8_PLANAR     (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
  444. #define TYPE_CMYK_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
  445. #define TYPE_CMYK_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
  446. #define TYPE_YUVK_16           TYPE_CMYK_16_REV
  447. #define TYPE_CMYK_16_PLANAR    (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
  448. #define TYPE_CMYK_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
  449.  
  450. #define TYPE_KYMC_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
  451. #define TYPE_KYMC_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
  452. #define TYPE_KYMC_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  453.  
  454. #define TYPE_KCMY_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
  455. #define TYPE_KCMY_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
  456. #define TYPE_KCMY_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
  457. #define TYPE_KCMY_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
  458. #define TYPE_KCMY_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
  459.  
  460.  
  461. // HiFi separations, Thanks to Steven Greaves for providing the code,
  462. // the colorspace is not checked
  463. #define TYPE_CMYK5_8           (CHANNELS_SH(5)|BYTES_SH(1))
  464. #define TYPE_CMYK5_16          (CHANNELS_SH(5)|BYTES_SH(2))
  465. #define TYPE_CMYK5_16_SE       (CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
  466. #define TYPE_KYMC5_8           (CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
  467. #define TYPE_KYMC5_16          (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
  468. #define TYPE_KYMC5_16_SE       (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  469.  
  470. #define TYPE_CMYKcm_8          (CHANNELS_SH(6)|BYTES_SH(1))
  471. #define TYPE_CMYKcm_8_PLANAR   (CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
  472. #define TYPE_CMYKcm_16         (CHANNELS_SH(6)|BYTES_SH(2))
  473. #define TYPE_CMYKcm_16_PLANAR  (CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
  474. #define TYPE_CMYKcm_16_SE      (CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
  475.  
  476. // Separations with more than 6 channels aren't very standarized,
  477. // Except most start with CMYK and add other colors, so I just used
  478. // then total number of channels after CMYK i.e CMYK8_8
  479.  
  480. #define TYPE_CMYK7_8           (CHANNELS_SH(7)|BYTES_SH(1))
  481. #define TYPE_CMYK7_16          (CHANNELS_SH(7)|BYTES_SH(2))
  482. #define TYPE_CMYK7_16_SE       (CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
  483. #define TYPE_KYMC7_8           (CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
  484. #define TYPE_KYMC7_16          (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
  485. #define TYPE_KYMC7_16_SE       (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  486. #define TYPE_CMYK8_8           (CHANNELS_SH(8)|BYTES_SH(1))
  487. #define TYPE_CMYK8_16          (CHANNELS_SH(8)|BYTES_SH(2))
  488. #define TYPE_CMYK8_16_SE       (CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
  489. #define TYPE_KYMC8_8           (CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
  490. #define TYPE_KYMC8_16          (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
  491. #define TYPE_KYMC8_16_SE       (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  492. #define TYPE_CMYK9_8           (CHANNELS_SH(9)|BYTES_SH(1))
  493. #define TYPE_CMYK9_16          (CHANNELS_SH(9)|BYTES_SH(2))
  494. #define TYPE_CMYK9_16_SE       (CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
  495. #define TYPE_KYMC9_8           (CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
  496. #define TYPE_KYMC9_16          (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
  497. #define TYPE_KYMC9_16_SE       (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  498. #define TYPE_CMYK10_8          (CHANNELS_SH(10)|BYTES_SH(1))
  499. #define TYPE_CMYK10_16         (CHANNELS_SH(10)|BYTES_SH(2))
  500. #define TYPE_CMYK10_16_SE      (CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
  501. #define TYPE_KYMC10_8          (CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
  502. #define TYPE_KYMC10_16         (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
  503. #define TYPE_KYMC10_16_SE      (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  504. #define TYPE_CMYK11_8          (CHANNELS_SH(11)|BYTES_SH(1))
  505. #define TYPE_CMYK11_16         (CHANNELS_SH(11)|BYTES_SH(2))
  506. #define TYPE_CMYK11_16_SE      (CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
  507. #define TYPE_KYMC11_8          (CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
  508. #define TYPE_KYMC11_16         (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
  509. #define TYPE_KYMC11_16_SE      (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  510. #define TYPE_CMYK12_8          (CHANNELS_SH(12)|BYTES_SH(1))
  511. #define TYPE_CMYK12_16         (CHANNELS_SH(12)|BYTES_SH(2))
  512. #define TYPE_CMYK12_16_SE      (CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
  513. #define TYPE_KYMC12_8          (CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
  514. #define TYPE_KYMC12_16         (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
  515. #define TYPE_KYMC12_16_SE      (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  516.  
  517. // Colorimetric
  518.  
  519. #define TYPE_XYZ_16            (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
  520. #define TYPE_Lab_8             (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
  521. #define TYPE_ALab_8            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1))
  522. #define TYPE_Lab_16            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
  523. #define TYPE_Yxy_16            (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
  524.  
  525. // YCbCr
  526.  
  527. #define TYPE_YCbCr_8           (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
  528. #define TYPE_YCbCr_8_PLANAR    (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  529. #define TYPE_YCbCr_16          (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
  530. #define TYPE_YCbCr_16_PLANAR   (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  531. #define TYPE_YCbCr_16_SE       (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  532.  
  533. // YUV
  534.  
  535. #define TYPE_YUV_8           (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
  536. #define TYPE_YUV_8_PLANAR    (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  537. #define TYPE_YUV_16          (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
  538. #define TYPE_YUV_16_PLANAR   (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  539. #define TYPE_YUV_16_SE       (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  540.  
  541. // HLS
  542.  
  543. #define TYPE_HLS_8           (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
  544. #define TYPE_HLS_8_PLANAR    (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  545. #define TYPE_HLS_16          (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
  546. #define TYPE_HLS_16_PLANAR   (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  547. #define TYPE_HLS_16_SE       (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  548.  
  549.  
  550. // HSV
  551.  
  552. #define TYPE_HSV_8           (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
  553. #define TYPE_HSV_8_PLANAR    (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  554. #define TYPE_HSV_16          (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
  555. #define TYPE_HSV_16_PLANAR   (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  556. #define TYPE_HSV_16_SE       (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  557.  
  558. // Named color index. Only 16 bits allowed (don't check colorspace) 
  559.  
  560. #define TYPE_NAMED_COLOR_INDEX   (CHANNELS_SH(1)|BYTES_SH(2))
  561.  
  562. // Double values. Painful slow, but sometimes helpful. NOTE THAT BYTES IS SET TO ZERO!
  563.  
  564. #define TYPE_XYZ_DBL        (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
  565. #define TYPE_Lab_DBL        (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
  566. #define TYPE_GRAY_DBL       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
  567. #define TYPE_RGB_DBL        (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
  568. #define TYPE_CMYK_DBL       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
  569.  
  570. #endif
  571.  
  572. // Gamma tables.
  573.  
  574. typedef struct {
  575.               
  576.     int  nEntries;
  577.     WORD GammaTable[1];
  578.  
  579.     } GAMMATABLE;
  580.  
  581. typedef GAMMATABLE FAR* LPGAMMATABLE;
  582.  
  583.  
  584. // Sampled curves (1D)
  585.  
  586. typedef struct {
  587.  
  588.     int     nItems;
  589.     double* Values;
  590.  
  591.     } SAMPLEDCURVE;
  592.  
  593. typedef SAMPLEDCURVE FAR* LPSAMPLEDCURVE;
  594.  
  595.  
  596.  
  597. // Vectors
  598.  
  599. typedef struct {                // Float Vector
  600.  
  601.     double n[3];
  602.  
  603.     } VEC3;
  604.  
  605. typedef VEC3 FAR* LPVEC3;
  606.  
  607.  
  608.  
  609. typedef struct {                // Matrix
  610.         
  611.     VEC3 v[3];
  612.     
  613.     } MAT3; 
  614.  
  615. typedef MAT3 FAR* LPMAT3;
  616.  
  617.  
  618. // Colorspace values
  619.  
  620. typedef struct {
  621.     
  622.         double X;
  623.         double Y;
  624.         double Z;
  625.  
  626.     } cmsCIEXYZ; 
  627.         
  628. typedef cmsCIEXYZ FAR* LPcmsCIEXYZ;
  629.  
  630. typedef struct {
  631.                
  632.         double x;
  633.         double y;
  634.         double Y;
  635.  
  636.     } cmsCIExyY;
  637.  
  638. typedef cmsCIExyY FAR* LPcmsCIExyY;
  639.  
  640. typedef struct {
  641.                
  642.         double L;
  643.         double a;               
  644.         double b;
  645.                
  646.     } cmsCIELab;
  647.  
  648. typedef cmsCIELab FAR* LPcmsCIELab;
  649.  
  650. typedef struct {
  651.                
  652.         double L;
  653.         double C;
  654.         double h;
  655.  
  656.     } cmsCIELCh;
  657.  
  658. typedef cmsCIELCh FAR* LPcmsCIELCh;
  659.  
  660. typedef struct {
  661.                
  662.         double J;
  663.         double C;
  664.         double h;
  665.  
  666.     } cmsJCh;
  667.  
  668. typedef cmsJCh FAR* LPcmsJCh;
  669.  
  670. // Primaries
  671.  
  672. typedef struct {
  673.  
  674.         cmsCIEXYZ  Red;
  675.         cmsCIEXYZ  Green;
  676.         cmsCIEXYZ  Blue;
  677.  
  678.     } cmsCIEXYZTRIPLE;
  679.  
  680. typedef cmsCIEXYZTRIPLE FAR* LPcmsCIEXYZTRIPLE;
  681.  
  682.  
  683. typedef struct {
  684.               
  685.         cmsCIExyY  Red;
  686.         cmsCIExyY  Green;
  687.         cmsCIExyY  Blue;
  688.  
  689.     } cmsCIExyYTRIPLE;
  690.  
  691. typedef cmsCIExyYTRIPLE FAR* LPcmsCIExyYTRIPLE;
  692.  
  693.  
  694.  
  695. // Following ICC spec
  696.  
  697. #define D50X  (0.9642)  
  698. #define D50Y  (1.0)
  699. #define D50Z  (0.8249)
  700.  
  701. #define PERCEPTUAL_BLACK_X  (0.00336)
  702. #define PERCEPTUAL_BLACK_Y  (0.0034731)
  703. #define PERCEPTUAL_BLACK_Z  (0.00287)
  704.  
  705. // Does return pointers to constant structs
  706.  
  707. LCMSAPI LPcmsCIEXYZ LCMSEXPORT cmsD50_XYZ(void);
  708. LCMSAPI LPcmsCIExyY LCMSEXPORT cmsD50_xyY(void); 
  709.  
  710.  
  711. // Input/Output
  712.  
  713. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
  714. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize);
  715. LCMSAPI BOOL          LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
  716.  
  717. // Predefined run-time profiles
  718.  
  719. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateRGBProfile(LPcmsCIExyY WhitePoint,
  720.                                         LPcmsCIExyYTRIPLE Primaries,
  721.                                         LPGAMMATABLE TransferFunction[3]);
  722.  
  723. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateGrayProfile(LPcmsCIExyY WhitePoint,
  724.                                               LPGAMMATABLE TransferFunction);
  725.  
  726. LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorSpace,
  727.                                                         LPGAMMATABLE TransferFunctions[]);
  728.  
  729. LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature ColorSpace,
  730.                                                       double Limit);
  731.  
  732.  
  733. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint);
  734. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateXYZProfile(void);
  735. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreate_sRGBProfile(void);
  736.  
  737. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
  738.                                                      double Bright, 
  739.                                                      double Contrast,
  740.                                                      double Hue,
  741.                                                      double Saturation,
  742.                                                      int TempSrc, 
  743.                                                      int TempDest);
  744.  
  745.  
  746. // Colorimetric space conversions
  747.  
  748. LCMSAPI void          LCMSEXPORT cmsXYZ2xyY(LPcmsCIExyY Dest, const LPcmsCIEXYZ Source);
  749. LCMSAPI void          LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, const LPcmsCIExyY Source);
  750. LCMSAPI void          LCMSEXPORT cmsXYZ2Lab(LPcmsCIEXYZ WhitePoint, LPcmsCIELab Lab, const LPcmsCIEXYZ xyz);
  751. LCMSAPI void          LCMSEXPORT cmsLab2XYZ(LPcmsCIEXYZ WhitePoint, LPcmsCIEXYZ xyz, const LPcmsCIELab Lab);
  752. LCMSAPI void          LCMSEXPORT cmsLab2LCh(LPcmsCIELCh LCh, const LPcmsCIELab Lab);
  753. LCMSAPI void          LCMSEXPORT cmsLCh2Lab(LPcmsCIELab Lab, const LPcmsCIELCh LCh);
  754.  
  755.  
  756. // CIELab handling
  757.  
  758. LCMSAPI double        LCMSEXPORT cmsDeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  759. LCMSAPI double        LCMSEXPORT cmsCIE94DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  760. LCMSAPI double        LCMSEXPORT cmsBFDdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  761. LCMSAPI double        LCMSEXPORT cmsCMCdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  762. LCMSAPI double        LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2, double Kl, double Kc, double Kh);
  763.  
  764. LCMSAPI void          LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin);
  765.  
  766. LCMSAPI BOOL          LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
  767.  
  768. LCMSAPI BOOL          LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
  769.                                                         LPcmsCIEXYZ SourceWhitePt,
  770.                                                         LPcmsCIEXYZ Illuminant,
  771.                                                         LPcmsCIEXYZ Value);
  772.  
  773. LCMSAPI BOOL          LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
  774.                                                         LPcmsCIExyY WhitePoint,
  775.                                                         LPcmsCIExyYTRIPLE Primaries);
  776.  
  777. // CIECAM97s
  778.  
  779. #define AVG_SURROUND_4     0
  780. #define AVG_SURROUND       1
  781. #define DIM_SURROUND       2
  782. #define DARK_SURROUND      3
  783. #define CUTSHEET_SURROUND  4
  784.  
  785. #define D_CALCULATE             (-1)
  786. #define D_CALCULATE_DISCOUNT    (-2)
  787.  
  788. typedef struct {
  789.  
  790.               cmsCIEXYZ whitePoint;
  791.               double    Yb;
  792.               double    La;
  793.               int       surround;
  794.               double    D_value;
  795.  
  796.     } cmsViewingConditions;
  797.  
  798. typedef cmsViewingConditions FAR* LPcmsViewingConditions;
  799.  
  800.  
  801. LCMSAPI LCMSHANDLE    LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC2);
  802. LCMSAPI void          LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel);
  803. LCMSAPI void          LCMSEXPORT cmsCIECAM97sForward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
  804. LCMSAPI void          LCMSEXPORT cmsCIECAM97sReverse(LCMSHANDLE hModel, LPcmsJCh pIn,    LPcmsCIEXYZ pOut);
  805.  
  806.  
  807. // CIECAM02
  808.  
  809. LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC);
  810. LCMSAPI void       LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel);
  811. LCMSAPI void       LCMSEXPORT cmsCIECAM02Forward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
  812. LCMSAPI void       LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn,    LPcmsCIEXYZ pOut);
  813.  
  814.  
  815. // Gamma
  816.  
  817. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsBuildGamma(int nEntries, double Gamma);
  818. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]);
  819. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsAllocGamma(int nEntries);
  820. LCMSAPI void          LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma);
  821. LCMSAPI void          LCMSEXPORT cmsFreeGammaTriple(LPGAMMATABLE Gamma[3]);
  822. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsDupGamma(LPGAMMATABLE Src);
  823. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma);
  824. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma,  LPGAMMATABLE OutGamma);
  825. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma,  LPGAMMATABLE OutGamma, int nPoints);
  826. LCMSAPI BOOL          LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
  827. LCMSAPI double        LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t);
  828. LCMSAPI double        LCMSEXPORT cmsEstimateGammaEx(LPWORD Table, int nEntries, double Thereshold); 
  829. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig);
  830. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSignature sig);
  831.  
  832.  
  833.  
  834.  
  835. // Access to Profile data.
  836.  
  837. LCMSAPI BOOL          LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
  838. LCMSAPI BOOL          LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
  839. LCMSAPI BOOL          LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
  840. LCMSAPI BOOL          LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile);
  841. LCMSAPI DWORD         LCMSEXPORT cmsTakeHeaderFlags(cmsHPROFILE hProfile);
  842.  
  843. LCMSAPI void          LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode);
  844. LCMSAPI const char*   LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile);
  845. LCMSAPI const char*   LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile);
  846. LCMSAPI const char*   LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile);
  847. LCMSAPI const char*   LCMSEXPORT cmsTakeManufacturer(cmsHPROFILE hProfile);
  848. LCMSAPI const char*   LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile);
  849. LCMSAPI const char*   LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile);
  850. LCMSAPI const LPBYTE  LCMSEXPORT cmsTakeProfileID(cmsHPROFILE hProfile);
  851.  
  852. LCMSAPI BOOL          LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
  853. LCMSAPI int           LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile);
  854.  
  855. LCMSAPI BOOL          LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len);
  856.                                                   
  857. LCMSAPI int           LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Text);
  858.  
  859. typedef struct {
  860.  
  861.             icSignature                 deviceMfg;      
  862.             icSignature                 deviceModel;                
  863.             icUInt32Number              attributes[2];     
  864.             icTechnologySignature       technology;     
  865.             
  866.             char Manufacturer[512];
  867.             char Model[512];
  868.  
  869.     } cmsPSEQDESC, FAR *LPcmsPSEQDESC;
  870.  
  871. typedef struct {
  872.  
  873.             int n;
  874.             cmsPSEQDESC seq[1];
  875.  
  876.     } cmsSEQ, FAR *LPcmsSEQ;
  877.  
  878.  
  879. LCMSAPI LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile);
  880.  
  881.  
  882. // Translate form/to our notation to ICC 
  883. LCMSAPI icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation);
  884. LCMSAPI                   int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace);
  885. LCMSAPI                   int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace);
  886.  
  887. #define LCMS_USED_AS_INPUT      0
  888. #define LCMS_USED_AS_OUTPUT     1
  889. #define LCMS_USED_AS_PROOF      2
  890.  
  891. LCMSAPI BOOL         LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection);
  892.  
  893. LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
  894. LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
  895. LCMSAPI icProfileClassSignature LCMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);
  896. LCMSAPI DWORD                   LCMSEXPORT cmsGetProfileICCversion(cmsHPROFILE hProfile);
  897.  
  898. LCMSAPI void          LCMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, icProfileClassSignature sig);
  899. LCMSAPI void          LCMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig);
  900. LCMSAPI void          LCMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs);
  901. LCMSAPI void          LCMSEXPORT cmsSetRenderingIntent(cmsHPROFILE hProfile, int RenderingIntent);
  902. LCMSAPI void          LCMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, DWORD Flags);
  903. LCMSAPI void          LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID);
  904.  
  905. // Intents
  906.  
  907. #define INTENT_PERCEPTUAL                 0
  908. #define INTENT_RELATIVE_COLORIMETRIC      1
  909. #define INTENT_SATURATION                 2
  910. #define INTENT_ABSOLUTE_COLORIMETRIC      3
  911.  
  912. // Flags
  913.  
  914. #define cmsFLAGS_MATRIXINPUT              0x0001
  915. #define cmsFLAGS_MATRIXOUTPUT             0x0002
  916. #define cmsFLAGS_MATRIXONLY               (cmsFLAGS_MATRIXINPUT|cmsFLAGS_MATRIXOUTPUT)
  917.  
  918. #define cmsFLAGS_NOPRELINEARIZATION       0x0010    // Don't create prelinearization tables
  919.                                                     // on precalculated transforms (internal use)
  920.  
  921. #define cmsFLAGS_GUESSDEVICECLASS         0x0020    // Guess device class (for transform2devicelink)
  922.  
  923. #define cmsFLAGS_NOTCACHE                 0x0040    // Inhibit 1-pixel cache
  924.  
  925. #define cmsFLAGS_NOTPRECALC               0x0100    
  926. #define cmsFLAGS_NULLTRANSFORM            0x0200    // Don't transform anyway
  927. #define cmsFLAGS_HIGHRESPRECALC           0x0400    // Use more memory to give better accurancy
  928. #define cmsFLAGS_LOWRESPRECALC            0x0800    // Use less memory to minimize resouces
  929.  
  930.  
  931. #define cmsFLAGS_WHITEBLACKCOMPENSATION   0x2000    
  932. #define cmsFLAGS_BLACKPOINTCOMPENSATION   cmsFLAGS_WHITEBLACKCOMPENSATION   
  933.  
  934. // Proofing flags
  935.  
  936. #define cmsFLAGS_GAMUTCHECK               0x1000    // Out of Gamut alarm
  937. #define cmsFLAGS_SOFTPROOFING             0x4000    // Do softproofing
  938.  
  939.  
  940. // CRD special
  941.  
  942. #define cmsFLAGS_NODEFAULTRESOURCEDEF  0x00010000
  943.  
  944.  
  945. // Transforms
  946.  
  947. LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
  948.                                                DWORD InputFormat,
  949.                                                cmsHPROFILE Output,
  950.                                                DWORD OutputFormat,
  951.                                                int Intent,
  952.                                                DWORD dwFlags);
  953.  
  954. LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,
  955.                                                DWORD InputFormat,
  956.                                                cmsHPROFILE Output,
  957.                                                DWORD OutputFormat,
  958.                                                cmsHPROFILE Proofing,
  959.                                                int Intent,
  960.                                                int ProofingIntent,
  961.                                                DWORD dwFlags);
  962.  
  963. LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
  964.                                                                 int nProfiles,
  965.                                                                 DWORD InputFormat,
  966.                                                                 DWORD OutputFormat,
  967.                                                                 int Intent,
  968.                                                                 DWORD dwFlags);
  969.  
  970. LCMSAPI void         LCMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);
  971.  
  972. LCMSAPI void         LCMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
  973.                                                  LPVOID InputBuffer,
  974.                                                  LPVOID OutputBuffer,
  975.                                                  unsigned int Size);
  976.  
  977. LCMSAPI void         LCMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, DWORD InputFormat, DWORD dwOutputFormat);
  978.  
  979. LCMSAPI void         LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b);
  980. LCMSAPI void         LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b);
  981.  
  982.  
  983. // Named color support
  984. typedef struct {                
  985.                 char Name[MAX_PATH];
  986.                 WORD PCS[3];
  987.                 WORD DeviceColorant[MAXCHANNELS];
  988.                 
  989.  
  990.         } cmsNAMEDCOLOR, FAR* LPcmsNAMEDCOLOR;
  991.  
  992. typedef struct {
  993.                 int nColors;                
  994.                 int Allocated;
  995.                 int ColorantCount;  
  996.                 char Prefix[33];
  997.                 char Suffix[33];     
  998.                 
  999.                 cmsNAMEDCOLOR List[1];                
  1000.  
  1001.         } cmsNAMEDCOLORLIST, FAR* LPcmsNAMEDCOLORLIST;
  1002.  
  1003. // Named color support
  1004.  
  1005. LCMSAPI int  LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform);
  1006. LCMSAPI BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix);
  1007. LCMSAPI int  LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name);
  1008.  
  1009. // Profile creation 
  1010.  
  1011. LCMSAPI BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, void* data);
  1012.  
  1013. // Converts a transform to a devicelink profile
  1014. LCMSAPI cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags);
  1015.  
  1016. LCMSAPI void LCMSEXPORT _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth);
  1017.  
  1018.  
  1019.  
  1020. // Save profile
  1021. LCMSAPI BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName);
  1022. LCMSAPI BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, 
  1023.                                                                 size_t* BytesNeeded);
  1024.  
  1025.  
  1026.  
  1027. // PostScript ColorRenderingDictionary and ColorSpaceArray
  1028.  
  1029. LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
  1030. LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRD(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
  1031. LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, int Intent, DWORD dwFlags, LPVOID Buffer, DWORD dwBufferLen);
  1032.  
  1033.  
  1034. // Error handling
  1035.  
  1036. #define LCMS_ERROR_ABORT    0
  1037. #define LCMS_ERROR_SHOW     1
  1038. #define LCMS_ERROR_IGNORE   2
  1039.  
  1040. LCMSAPI int LCMSEXPORT cmsErrorAction(int nAction);
  1041.  
  1042. #define LCMS_ERRC_WARNING        0x1000
  1043. #define LCMS_ERRC_RECOVERABLE    0x2000
  1044. #define LCMS_ERRC_ABORTED        0x3000
  1045.  
  1046. typedef int (* cmsErrorHandlerFunction)(int ErrorCode, const char *ErrorText);
  1047.  
  1048.  
  1049.  
  1050. LCMSAPI void LCMSEXPORT cmsSetErrorHandler(cmsErrorHandlerFunction Fn);
  1051.  
  1052.  
  1053. // LUT manipulation
  1054.  
  1055.  
  1056. typedef struct _lcms_LUT_struc LUT, FAR* LPLUT; // opaque pointer
  1057.  
  1058. LCMSAPI LPLUT LCMSEXPORT cmsAllocLUT(void);
  1059. LCMSAPI LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nTable);
  1060. LCMSAPI LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT Lut, int clutPoints, int inputChan, int outputChan);
  1061. LCMSAPI LPLUT LCMSEXPORT cmsSetMatrixLUT(LPLUT Lut, LPMAT3 M);
  1062. LCMSAPI LPLUT LCMSEXPORT cmsSetMatrixLUT4(LPLUT Lut, LPMAT3 M, LPVEC3 off, DWORD dwFlags);
  1063. LCMSAPI void  LCMSEXPORT cmsFreeLUT(LPLUT Lut);
  1064. LCMSAPI void  LCMSEXPORT cmsEvalLUT(LPLUT Lut, WORD In[], WORD Out[]);
  1065. LCMSAPI LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig);
  1066. LCMSAPI LPLUT LCMSEXPORT cmsDupLUT(LPLUT Orig);
  1067.  
  1068. // LUT Sampling
  1069.  
  1070. typedef int (* _cmsSAMPLER)(register WORD In[],
  1071.                             register WORD Out[],
  1072.                             register LPVOID Cargo);
  1073.  
  1074. #define SAMPLER_HASTL1      LUT_HASTL1
  1075. #define SAMPLER_HASTL2      LUT_HASTL2
  1076. #define SAMPLER_INSPECT     0x01000000
  1077.  
  1078. LCMSAPI int LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags);
  1079.  
  1080. // Formatters
  1081.  
  1082. typedef unsigned char* (* cmsFORMATTER)(register void* CMMcargo,
  1083.                                         register WORD ToUnroll[],
  1084.                                         register LPBYTE Buffer);
  1085.  
  1086. LCMSAPI void LCMSEXPORT cmsSetUserFormatters(cmsHTRANSFORM hTransform, DWORD dwInput,  cmsFORMATTER Input,
  1087.                                                                DWORD dwOutput, cmsFORMATTER Output);
  1088.  
  1089. LCMSAPI void LCMSEXPORT cmsGetUserFormatters(cmsHTRANSFORM hTransform, 
  1090.                                                                LPDWORD InputFormat, cmsFORMATTER* Input, 
  1091.                                                                LPDWORD OutputFormat, cmsFORMATTER* Output);
  1092.  
  1093.  
  1094. // IT8.7 / CGATS.17-200x handling
  1095.  
  1096. LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8Alloc(void);
  1097. LCMSAPI void            LCMSEXPORT cmsIT8Free(LCMSHANDLE IT8);
  1098.  
  1099. // Tables
  1100.  
  1101. LCMSAPI int             LCMSEXPORT cmsIT8TableCount(LCMSHANDLE IT8);
  1102. LCMSAPI int             LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable);
  1103.  
  1104. // Persistence
  1105. LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
  1106. LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
  1107. LCMSAPI BOOL            LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
  1108.  
  1109. // Properties
  1110. LCMSAPI const char*     LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
  1111. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
  1112.  
  1113. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
  1114.  
  1115. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
  1116. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
  1117. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
  1118. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
  1119.  
  1120.  
  1121. LCMSAPI const char*     LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
  1122. LCMSAPI double          LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
  1123. LCMSAPI int             LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames);
  1124.  
  1125. // Datasets
  1126.  
  1127. LCMSAPI const char*     LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);                                                
  1128. LCMSAPI double          LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int row, int col);
  1129.  
  1130. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, 
  1131.                                                 const char* Val);
  1132.  
  1133. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, 
  1134.                                                 double Val);
  1135.  
  1136. LCMSAPI const char*     LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);                                                
  1137.  
  1138.  
  1139. LCMSAPI double          LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
  1140.  
  1141. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
  1142.                                                 const char* cSample,
  1143.                                                 const char *Val);
  1144.  
  1145. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
  1146.                                                 const char* cSample,
  1147.                                                 double Val);
  1148.  
  1149. LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
  1150. LCMSAPI int             LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
  1151. LCMSAPI const char*     LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
  1152.  
  1153. // The LABEL extension
  1154.  
  1155. LCMSAPI int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
  1156.  
  1157.  
  1158.  
  1159. // ***************************************************************************
  1160. // End of Little cms API From here functions are private
  1161. // You can use them only if using static libraries, and at your own risk of
  1162. // be stripped or changed at futures releases.
  1163.  
  1164. #ifndef LCMS_APIONLY
  1165.  
  1166.  
  1167. // Compatibility with anterior versions-- not needed anymore
  1168. //  -- Morge
  1169.  
  1170. LCMSAPI void          LCMSEXPORT cmsLabEncoded2Float(LPcmsCIELab Lab, const WORD wLab[3]);
  1171. LCMSAPI void          LCMSEXPORT cmsLabEncoded2Float4(LPcmsCIELab Lab, const WORD wLab[3]);
  1172. LCMSAPI void          LCMSEXPORT cmsFloat2LabEncoded(WORD wLab[3], const LPcmsCIELab Lab);
  1173. LCMSAPI void          LCMSEXPORT cmsFloat2LabEncoded4(WORD wLab[3], const LPcmsCIELab Lab);
  1174. LCMSAPI void          LCMSEXPORT cmsXYZEncoded2Float(LPcmsCIEXYZ fxyz, const WORD XYZ[3]);
  1175. LCMSAPI void          LCMSEXPORT cmsFloat2XYZEncoded(WORD XYZ[3], const LPcmsCIEXYZ fXYZ);
  1176.  
  1177.  
  1178. // Profiling Extensions --- Would be removed from API in future revisions
  1179.  
  1180. LCMSAPI BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile,  icTagSignature sig, const char* Text);
  1181. LCMSAPI BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile,   icTagSignature sig, const LPcmsCIEXYZ XYZ);
  1182. LCMSAPI BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile,   icTagSignature sig, void* lut);
  1183. LCMSAPI BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction);
  1184. LCMSAPI BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm);
  1185. LCMSAPI BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq);
  1186. LCMSAPI BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
  1187.  
  1188. //  -- end of morge
  1189.  
  1190.  
  1191. // Signal error from inside lcms code
  1192.  
  1193. void cdecl cmsSignalError(int ErrorCode, const char *ErrorText, ...);
  1194.  
  1195. // Alignment handling (needed in ReadLUT16 and ReadLUT8)
  1196.  
  1197. typedef struct {
  1198.         icS15Fixed16Number a;
  1199.         icUInt16Number     b;
  1200.  
  1201.        } _cmsTestAlign16;
  1202.  
  1203. #define SIZEOF_UINT16_ALIGNED (sizeof(_cmsTestAlign16) - sizeof(icS15Fixed16Number))
  1204.  
  1205. typedef struct {
  1206.         icS15Fixed16Number a;
  1207.         icUInt8Number      b;
  1208.  
  1209.        } _cmsTestAlign8;
  1210.  
  1211. #define SIZEOF_UINT8_ALIGNED (sizeof(_cmsTestAlign8) - sizeof(icS15Fixed16Number))
  1212.  
  1213.  
  1214. // Fixed point
  1215.  
  1216.  
  1217. typedef icInt32Number Fixed32;       // Fixed 15.16 whith sign
  1218.  
  1219. #define INT_TO_FIXED(x)         ((x)<<16)
  1220. #define DOUBLE_TO_FIXED(x)      ((Fixed32) ((x)*65536.0+0.5))
  1221. #define FIXED_TO_INT(x)         ((x)>>16)
  1222. #define FIXED_REST_TO_INT(x)    ((x)& 0xFFFFU)
  1223. #define FIXED_TO_DOUBLE(x)      (((double)x)/65536.0)
  1224. #define ROUND_FIXED_TO_INT(x)   (((x)+0x8000)>>16)
  1225.  
  1226.  
  1227. Fixed32 cdecl FixedMul(Fixed32 a, Fixed32 b);
  1228. Fixed32 cdecl FixedSquare(Fixed32 a);
  1229.  
  1230.  
  1231. #ifdef USE_INLINE
  1232.  
  1233. LCMS_INLINE Fixed32 ToFixedDomain(int a)        { return a + ((a + 0x7fff) / 0xffff); }
  1234. LCMS_INLINE int     FromFixedDomain(Fixed32 a)  { return a - ((a + 0x7fff) >> 16); }   
  1235.  
  1236. #else
  1237.  
  1238. Fixed32 cdecl ToFixedDomain(int a);              // (a * 65536.0 / 65535.0)
  1239. int     cdecl FromFixedDomain(Fixed32 a);        // (a * 65535.0 + .5)
  1240.  
  1241. #endif
  1242.  
  1243. Fixed32 cdecl FixedLERP(Fixed32 a, Fixed32 l, Fixed32 h);
  1244. WORD    cdecl FixedScale(WORD a, Fixed32 s);
  1245.  
  1246. // Vector & Matrix operations. I'm using the notation frequently found in
  1247. // literature. Mostly 'Graphic Gems' samples. Not to be same routines.
  1248.  
  1249. // Vector members
  1250.  
  1251. #define VX      0
  1252. #define VY      1
  1253. #define VZ      2
  1254.  
  1255. typedef struct {                // Fixed 15.16 bits vector
  1256.         Fixed32 n[3];
  1257.         } WVEC3, FAR* LPWVEC3;
  1258.  
  1259. typedef struct {                // Matrix (Fixed 15.16)
  1260.         WVEC3 v[3];
  1261.         } WMAT3, FAR* LPWMAT3;
  1262.  
  1263.  
  1264.  
  1265. void cdecl VEC3init(LPVEC3 r, double x, double y, double z);   // double version
  1266. void cdecl VEC3initF(LPWVEC3 r, double x, double y, double z); // Fix32 version
  1267. void cdecl VEC3toFix(LPWVEC3 r, LPVEC3 v);
  1268. void cdecl VEC3fromFix(LPVEC3 r, LPWVEC3 v);
  1269. void cdecl VEC3scaleFix(LPWORD r, LPWVEC3 Scale);
  1270. void cdecl VEC3swap(LPVEC3 a, LPVEC3 b);
  1271. void cdecl VEC3divK(LPVEC3 r, LPVEC3 v, double d);
  1272. void cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d);
  1273. void cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b);
  1274. void cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b);
  1275. BOOL cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance);
  1276. void cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d);
  1277. void cdecl VEC3saturate(LPVEC3 v);
  1278.  
  1279. void cdecl MAT3identity(LPMAT3 a);
  1280. void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
  1281. void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d);
  1282. int  cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
  1283. void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
  1284. void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
  1285. void cdecl MAT3fromFix(LPMAT3 r, LPWMAT3 v);
  1286. void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v);
  1287. BOOL cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance);
  1288. void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d);
  1289.  
  1290. // Is a table linear?
  1291.  
  1292. int  cdecl cmsIsLinear(WORD Table[], int nEntries);
  1293.  
  1294. // I hold this structures describing domain
  1295. // details mainly for optimization purposes.
  1296.  
  1297. struct _lcms_l16params_struc;
  1298.  
  1299. typedef void (* _cms3DLERP)(WORD Input[],
  1300.                             WORD Output[],
  1301.                             WORD LutTable[],
  1302.                             struct _lcms_l16params_struc* p);
  1303.  
  1304.  
  1305.  
  1306. typedef struct _lcms_l8opt_struc {      // Used on 8 bit interpolations
  1307.  
  1308.               unsigned int X0[256], Y0[256], Z0[256];
  1309.               WORD rx[256], ry[256], rz[256];
  1310.  
  1311.         } L8PARAMS, FAR* LPL8PARAMS;
  1312.  
  1313. typedef struct _lcms_l16params_struc {    // Used on 16 bits interpolations
  1314.  
  1315.                int nSamples;       // Valid on all kinds of tables
  1316.                int nInputs;        // != 1 only in 3D interpolation
  1317.                int nOutputs;       // != 1 only in 3D interpolation
  1318.  
  1319.                WORD Domain;
  1320.  
  1321.                int opta1, opta2;
  1322.                int opta3, opta4;     // Optimization for 3D LUT
  1323.                int opta5, opta6;
  1324.                int opta7, opta8;
  1325.  
  1326.                _cms3DLERP Interp3D; // The interpolation routine
  1327.                 
  1328.                 LPL8PARAMS p8;      // Points to some tables for 8-bit speedup
  1329.  
  1330.                } L16PARAMS, *LPL16PARAMS;
  1331.  
  1332.  
  1333. void    cdecl cmsCalcL16Params(int nSamples, LPL16PARAMS p);
  1334. void    cdecl cmsCalcCLUT16Params(int nSamples, int InputChan, int OutputChan, LPL16PARAMS p);
  1335. void    cdecl cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan, 
  1336.                                             BOOL lUseTetrahedral, LPL16PARAMS p);
  1337.  
  1338. WORD    cdecl cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
  1339. Fixed32 cdecl cmsLinearInterpFixed(WORD Value1, WORD LutTable[], LPL16PARAMS p);
  1340. WORD    cdecl cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
  1341.  
  1342. void cdecl cmsTrilinearInterp16(WORD Input[],
  1343.                                 WORD Output[],
  1344.                                 WORD LutTable[],
  1345.                                 LPL16PARAMS p);
  1346.  
  1347. void cdecl cmsTetrahedralInterp16(WORD Input[],
  1348.                                   WORD Output[],
  1349.                                   WORD LutTable[], LPL16PARAMS p);
  1350.  
  1351. void cdecl cmsTetrahedralInterp8(WORD Input[],
  1352.                                  WORD Output[],
  1353.                                  WORD LutTable[],  LPL16PARAMS p);
  1354.  
  1355. // LUT handling
  1356.  
  1357. #define LUT_HASMATRIX       0x0001        // Do-op Flags
  1358. #define LUT_HASTL1          0x0002
  1359. #define LUT_HASTL2          0x0008
  1360. #define LUT_HAS3DGRID       0x0010
  1361.  
  1362. // New in rev 4.0 of ICC spec
  1363.  
  1364. #define LUT_HASMATRIX3     0x0020   // Matrix + offset for LutAToB
  1365. #define LUT_HASMATRIX4     0x0040   // Matrix + offset for LutBToA
  1366.  
  1367. #define LUT_HASTL3         0x0100   // '3' curves for LutAToB
  1368. #define LUT_HASTL4         0x0200   // '4' curves for LutBToA
  1369.  
  1370. // V4 emulation
  1371.  
  1372. #define LUT_V4_OUTPUT_EMULATE_V2    0x10000     // Is a V4 output LUT, emulating V2
  1373. #define LUT_V4_INPUT_EMULATE_V2     0x20000     // Is a V4 input LUT, emulating V2
  1374. #define LUT_V2_OUTPUT_EMULATE_V4    0x40000     // Is a V2 output LUT, emulating V4
  1375. #define LUT_V2_INPUT_EMULATE_V4     0x80000     // Is a V2 input LUT, emulating V4
  1376.  
  1377.  
  1378. struct _lcms_LUT_struc {
  1379.  
  1380.                DWORD wFlags;
  1381.                WMAT3 Matrix;                    // 15fixed16 matrix
  1382.  
  1383.                unsigned int InputChan;
  1384.                unsigned int OutputChan;
  1385.                unsigned int InputEntries;
  1386.                unsigned int OutputEntries;
  1387.                unsigned int cLutPoints;
  1388.  
  1389.                
  1390.                LPWORD L1[MAXCHANNELS];          // First linearization
  1391.                LPWORD L2[MAXCHANNELS];          // Last linearization
  1392.  
  1393.                LPWORD T;                        // 3D CLUT
  1394.                unsigned int Tsize;              // CLUT size in bytes
  1395.  
  1396.               // Parameters & Optimizations
  1397.  
  1398.                L16PARAMS In16params;
  1399.                L16PARAMS Out16params;
  1400.                L16PARAMS CLut16params;
  1401.  
  1402.                int Intent;                       // Accomplished intent
  1403.  
  1404.                // New for Rev 4.0 of spec (reserved)
  1405.  
  1406.                WMAT3 Mat3;
  1407.                WVEC3 Ofs3;
  1408.                LPWORD L3[MAXCHANNELS]; 
  1409.                L16PARAMS L3params;  
  1410.                unsigned int L3Entries;
  1411.  
  1412.                WMAT3 Mat4;
  1413.                WVEC3 Ofs4;
  1414.                LPWORD L4[MAXCHANNELS];                           
  1415.                L16PARAMS L4params;             
  1416.                unsigned int L4Entries;
  1417.  
  1418.  
  1419.                }; // LUT, FAR* LPLUT;
  1420.  
  1421.  
  1422. BOOL         cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries);
  1423.  
  1424. // Sampled curves
  1425.  
  1426. LPSAMPLEDCURVE cdecl cmsAllocSampledCurve(int nItems);
  1427. void           cdecl cmsFreeSampledCurve(LPSAMPLEDCURVE p);
  1428. LPSAMPLEDCURVE cdecl cmsDupSampledCurve(LPSAMPLEDCURVE p);
  1429.  
  1430. LPSAMPLEDCURVE cdecl cmsConvertGammaToSampledCurve(LPGAMMATABLE Gamma, int nPoints);
  1431. LPGAMMATABLE   cdecl cmsConvertSampledCurveToGamma(LPSAMPLEDCURVE Sampled, double Max);
  1432.  
  1433. void           cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
  1434. void           cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
  1435. BOOL           cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
  1436. void           cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
  1437.  
  1438. LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
  1439.  
  1440. // Shaper/Matrix handling
  1441.  
  1442. #define MATSHAPER_HASMATRIX        0x0001        // Do-ops flags
  1443. #define MATSHAPER_HASSHAPER        0x0002
  1444. #define MATSHAPER_INPUT            0x0004        // Behaviour
  1445. #define MATSHAPER_OUTPUT           0x0008
  1446. #define MATSHAPER_HASINPSHAPER     0x0010
  1447. #define MATSHAPER_ALLSMELTED       (MATSHAPER_INPUT|MATSHAPER_OUTPUT)
  1448.  
  1449.  
  1450. typedef struct {
  1451.                DWORD dwFlags;
  1452.  
  1453.                WMAT3 Matrix;
  1454.  
  1455.                L16PARAMS p16;       // Primary curve
  1456.                LPWORD L[3];
  1457.                
  1458.                L16PARAMS p2_16;     // Secondary curve (used as input in smelted ones)
  1459.                LPWORD L2[3];
  1460.  
  1461.                } MATSHAPER, FAR* LPMATSHAPER;
  1462.  
  1463. LPMATSHAPER cdecl cmsAllocMatShaper(LPMAT3 matrix, LPGAMMATABLE Shaper[], DWORD Behaviour);
  1464. LPMATSHAPER cdecl cmsAllocMatShaper2(LPMAT3 matrix, LPGAMMATABLE In[], LPGAMMATABLE Out[], DWORD Behaviour);
  1465.  
  1466. void        cdecl cmsFreeMatShaper(LPMATSHAPER MatShaper);
  1467. void        cdecl cmsEvalMatShaper(LPMATSHAPER MatShaper, WORD In[], WORD Out[]);
  1468.  
  1469. BOOL         cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);
  1470.  
  1471. LPMATSHAPER  cdecl cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile, LPDWORD dwFlags);
  1472. LPMATSHAPER  cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile, LPDWORD dwFlags);
  1473.  
  1474.  
  1475.  
  1476. // White Point & Primary chromas handling
  1477. BOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll);
  1478. BOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt);
  1479. BOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt);
  1480.  
  1481. BOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile);
  1482.  
  1483. // Inter-PCS conversion routines. They assume D50 as white point.
  1484. void cdecl cmsXYZ2LabEncoded(WORD XYZ[3], WORD Lab[3]);
  1485. void cdecl cmsLab2XYZEncoded(WORD Lab[3], WORD XYZ[3]);
  1486.  
  1487. // Retrieve text representation of WP
  1488. void cdecl _cmsIdentifyWhitePoint(char *Buffer, LPcmsCIEXYZ WhitePt);
  1489.  
  1490. // Quantize to WORD in a (MaxSamples - 1) domain
  1491. WORD cdecl _cmsQuantizeVal(double i, int MaxSamples);
  1492.  
  1493. LPcmsNAMEDCOLORLIST  cdecl cmsAllocNamedColorList(int n);
  1494. int                  cdecl cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSignature sig);
  1495. void                 cdecl cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST List);
  1496. BOOL                 cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]);
  1497.  
  1498.  
  1499. // I/O
  1500.  
  1501. #define MAX_TABLE_TAG       50
  1502.  
  1503. // This is the internal struct holding profile details.
  1504.  
  1505. typedef struct {
  1506.  
  1507.               void*           stream;   // Associated stream. If NULL,
  1508.                                         // tags are supposed to be in
  1509.                                         // memory rather than in a file.
  1510.  
  1511.                // Only most important items found in ICC profile
  1512.  
  1513.                icProfileClassSignature DeviceClass;
  1514.                icColorSpaceSignature   ColorSpace;
  1515.                icColorSpaceSignature   PCS;
  1516.                icRenderingIntent       RenderingIntent;
  1517.                icUInt32Number          flags;
  1518.                cmsCIEXYZ               Illuminant;
  1519.                
  1520.                // Additions for V4 profiles
  1521.  
  1522.                icUInt32Number          Version;
  1523.                MAT3                    ChromaticAdaptation;
  1524.                cmsCIEXYZ               MediaWhitePoint;
  1525.                cmsCIEXYZ               MediaBlackPoint;
  1526.                BYTE                    ProfileID[16];
  1527.  
  1528.  
  1529.                // Dictionary
  1530.  
  1531.                icInt32Number   TagCount;
  1532.                icTagSignature  TagNames[MAX_TABLE_TAG];
  1533.                size_t          TagSizes[MAX_TABLE_TAG];
  1534.                size_t          TagOffsets[MAX_TABLE_TAG];
  1535.                LPVOID          TagPtrs[MAX_TABLE_TAG];
  1536.  
  1537.                char            PhysicalFile[MAX_PATH];
  1538.                
  1539.                BOOL            IsWrite;
  1540.                BOOL            SaveAs8Bits;
  1541.  
  1542.                // I/O handlers
  1543.  
  1544.                size_t (* Read)(void *buffer, size_t size, size_t count, void *stream);
  1545.                
  1546.                BOOL   (* Seek)(void* stream, size_t offset);
  1547.                BOOL   (* Close)(void* stream);
  1548.                size_t (* Tell)(void* stream);
  1549.                
  1550.                // Writting
  1551.  
  1552.                BOOL   (* Write)(void* stream, size_t size, LPVOID Ptr);
  1553.              
  1554.               } LCMSICCPROFILE, FAR* LPLCMSICCPROFILE;
  1555.  
  1556.  
  1557. // Create an empty template for virtual profiles
  1558. cmsHPROFILE cdecl _cmsCreateProfilePlaceholder(void);
  1559.  
  1560.  
  1561. // These macros unpack format specifiers into integers
  1562.  
  1563. #define T_COLORSPACE(s)       (((s)>>16)&31)
  1564. #define T_SWAPFIRST(s)        (((s)>>14)&1)
  1565. #define T_FLAVOR(s)           (((s)>>13)&1)
  1566. #define T_PLANAR(p)           (((p)>>12)&1)
  1567. #define T_ENDIAN16(e)         (((e)>>11)&1)
  1568. #define T_DOSWAP(e)           (((e)>>10)&1)
  1569. #define T_EXTRA(e)            (((e)>>7)&7)
  1570. #define T_CHANNELS(c)         (((c)>>3)&15)
  1571. #define T_BYTES(b)            ((b)&7)
  1572.  
  1573.  
  1574.  
  1575. // Internal XFORM struct
  1576. struct _cmstransform_struct;
  1577.  
  1578. // Full xform
  1579. typedef void (* _cmsCOLORCALLBACKFN)(struct _cmstransform_struct *Transform,
  1580.                                LPVOID InputBuffer,
  1581.                                LPVOID OutputBuffer, unsigned int Size);
  1582.  
  1583. // intermediate pass, from WORD[] to WORD[]
  1584.  
  1585. typedef void   (* _cmsADJFN)(WORD In[], WORD Out[], LPWMAT3 m, LPWVEC3 b);
  1586.  
  1587. typedef void   (* _cmsTRANSFN)(struct _cmstransform_struct *Transform,
  1588.                                WORD In[], WORD Out[]);
  1589.  
  1590. typedef void   (* _cmsCNVRT)(WORD In[], WORD Out[]);
  1591.  
  1592. typedef LPBYTE (* _cmsFIXFN)(register struct _cmstransform_struct *info,
  1593.                              register WORD ToUnroll[],
  1594.                              register LPBYTE Buffer);
  1595.  
  1596.  
  1597.  
  1598. // Transformation
  1599. typedef struct _cmstransform_struct {
  1600.  
  1601.                             // Keep formats for further reference
  1602.                             DWORD InputFormat, OutputFormat;
  1603.                            
  1604.                             DWORD StrideIn, StrideOut;      // Planar support
  1605.  
  1606.                             int Intent, ProofIntent;
  1607.                             int DoGamutCheck;
  1608.  
  1609.                             cmsHPROFILE InputProfile;
  1610.                             cmsHPROFILE OutputProfile;
  1611.                             cmsHPROFILE PreviewProfile;
  1612.  
  1613.                             icColorSpaceSignature EntryColorSpace;
  1614.                             icColorSpaceSignature ExitColorSpace;
  1615.                         
  1616.                             WMAT3 m1, m2;       // Matrix holding inter PCS operation
  1617.                             WVEC3 of1, of2;     // Offset terms
  1618.  
  1619.                             _cmsCOLORCALLBACKFN xform;
  1620.  
  1621.                             // Steps in xFORM
  1622.  
  1623.                             _cmsFIXFN   FromInput;
  1624.                             _cmsTRANSFN FromDevice;
  1625.                             _cmsADJFN   Stage1;
  1626.                             _cmsADJFN   Stage2;
  1627.                             _cmsTRANSFN ToDevice;
  1628.                             _cmsFIXFN   ToOutput;
  1629.  
  1630.                             // LUTs
  1631.  
  1632.                             LPLUT Device2PCS;
  1633.                             LPLUT PCS2Device;
  1634.                             LPLUT Gamut;         // Gamut check
  1635.                             LPLUT Preview;       // Preview (Proof)
  1636.  
  1637.                             LPLUT DeviceLink;    // Precalculated grid -
  1638.                                                  // device link profile
  1639.  
  1640.                             // Matrix/Shapers
  1641.  
  1642.                             LPMATSHAPER InMatShaper;
  1643.                             LPMATSHAPER OutMatShaper;
  1644.                             LPMATSHAPER SmeltMatShaper;
  1645.  
  1646.  
  1647.                             // Phase of Lab/XYZ, Abs/Rel
  1648.  
  1649.                             int Phase1, Phase2, Phase3;
  1650.  
  1651.                             // Named color table
  1652.                             LPcmsNAMEDCOLORLIST NamedColorList;
  1653.                                
  1654.                             // Flag for transform involving v4 profiles
  1655.  
  1656.                             BOOL lInputV4Lab, lOutputV4Lab;
  1657.  
  1658.                             // 1-pixel cache
  1659.  
  1660.                             WORD CacheIn[MAXCHANNELS];
  1661.                             WORD CacheOut[MAXCHANNELS];
  1662.  
  1663.                             } _cmsTRANSFORM,FAR *_LPcmsTRANSFORM;
  1664.  
  1665.  
  1666.  
  1667. // Packing & Unpacking
  1668.  
  1669. _cmsFIXFN cdecl _cmsIdentifyInputFormat(_LPcmsTRANSFORM xform,  DWORD dwInput);
  1670. _cmsFIXFN cdecl _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput);
  1671.  
  1672.  
  1673. // Conversion
  1674.  
  1675. #define XYZRel       0
  1676. #define LabRel       1
  1677.  
  1678.  
  1679. int cdecl cmsChooseCnvrt(int Absolute,
  1680.                  int Phase1, LPcmsCIEXYZ BlackPointIn,
  1681.                              LPcmsCIEXYZ WhitePointIn,
  1682.                              LPcmsCIEXYZ IlluminantIn,
  1683.                              LPMAT3 ChromaticAdaptationMatrixIn,
  1684.  
  1685.                  int Phase2, LPcmsCIEXYZ BlackPointOut,
  1686.                              LPcmsCIEXYZ WhitePointOut,
  1687.                              LPcmsCIEXYZ IlluminantOut,
  1688.                              LPMAT3 ChromaticAdaptationMatrixOut,
  1689.                  int DoBPC,
  1690.                  _cmsADJFN *fn1,
  1691.                  LPWMAT3 wm, LPWVEC3 wof);
  1692.  
  1693.  
  1694.  
  1695. // Clamping & Gamut handling
  1696.  
  1697. BOOL cdecl   _cmsEndPointsBySpace(icColorSpaceSignature Space,
  1698.                             WORD **White, WORD **Black, int *nOutputs);
  1699.  
  1700. WORD * cdecl _cmsWhiteBySpace(icColorSpaceSignature Space);
  1701.  
  1702.  
  1703. WORD cdecl Clamp_XYZ(int in);
  1704. WORD cdecl Clamp_RGB(int in);
  1705.  
  1706. WORD cdecl Clamp_L(Fixed32 in);
  1707. WORD cdecl Clamp_ab(Fixed32 in);
  1708.  
  1709. // Detection of black point
  1710.  
  1711. #define LCMS_BPFLAGS_D50_ADAPTED    0x0001
  1712.  
  1713. int cdecl cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent, DWORD dwFlags);
  1714.  
  1715. // choose reasonable resolution
  1716. int cdecl _cmsReasonableGridpointsByColorspace(icColorSpaceSignature Colorspace, DWORD dwFlags);
  1717.  
  1718. // Precalculate device link
  1719. LPLUT cdecl _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags);
  1720.  
  1721. // Marks LUT as 8 bit on input
  1722. LPLUT cdecl _cmsBlessLUT8(LPLUT Lut);
  1723.  
  1724. // Compute gamut boundary
  1725. LPLUT cdecl _cmsComputeGamutLUT(cmsHPROFILE hProfile, int Intent);
  1726.  
  1727. // Compute softproof
  1728. LPLUT _cmsComputeSoftProofLUT(cmsHPROFILE hProfile, int nIntent);
  1729.  
  1730. // Find a suitable prelinearization tables, matching the given transform
  1731. void cdecl _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransforms, LPLUT Grid);
  1732.  
  1733. // These are two VITAL macros, from converting between 8 and 16 bit
  1734. // representation. 
  1735.  
  1736. #define RGB_8_TO_16(rgb) (WORD) ((((WORD) (rgb)) << 8)|(rgb)) 
  1737. #define RGB_16_TO_8(rgb) (BYTE) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF)
  1738.  
  1739.  
  1740. #endif  // LCMS_APIONLY
  1741.  
  1742.  
  1743. #define __cms_H
  1744.  
  1745. #ifdef __cplusplus
  1746. }
  1747. #endif
  1748.  
  1749. #endif
  1750.  
  1751.